/**
 * @addtogroup ofc_types.h
 * ofc_types.h
 * @{
 */
 /**
  * @file ofc_types.h
  * @brief 基础定义
  * @note
  * @author Leo

  * @par          修改日志
  * <table>
  * <tr><th>Date<th>Version<th>Author<th>Description
  * <tr><td>2019-05-24<td>1.0<td>Leo<td>创建初始版本
  * <tr><td>2019-11-13<td>1.1<td>Leo<td>oc_types.h->ofc_types.h, 去掉ofc库中不用的定义
  * <tr><td>2019-12-24<td>1.2<td>Akee<td>TTime从int改为long
  * <tr><td>2020-07-04<td>1.3<td>Leo<td>加入Long的定义
  * <tr><td>2020-07-29<td>1.4<td>Akee<td>加入CONTAINER_OF的定义
  * <tr><td>2020-08-21<td>1.5<td>Ada
  * <td> 1.去掉__int64_t、__uint64_t的定义 \n
  *      2.加入详细注解
  * <tr><td>2020-12-29<td>1.6<td>Leo<td>
  * 1. 为了保持与Kyee的库一致,直接引用Kyee的BaseTypes.h库,并把头文件中的相关内容去掉
  * 2. CONTAINER_OF改成OF_CONTAINER_OF
  * 3. NULL从原先(void *)0,改成0
  * @copyright 杭州鸿泉物联网技术股份有限公司
  */
#ifndef _OFC_TYPES_H_
#define _OFC_TYPES_H_

#include "BaseTypes.h"

#ifdef __cplusplus
extern "C"
{
#endif

    //--------------------------------------------------------------------------------
    // 常用宏定义
    /**@brief 获取成员变量在结构体中的相对位置
     * @param Type 结构体的类型
     * @param member 结构体中的成员变量
     * @return 成员变量的位置,类型为Long
     * @par 示例:
     * @code
     *     未压缩的情况下:
     *     struct TA{
     *	       @ref Int32 a;   // OF_OFFSET_OF(TA,a) 返回值0

     *	       @ref Int8 b;    // OF_OFFSET_OF(TA,b) 返回值4

     *	       @ref Int8 c;    // OF_OFFSET_OF(TA,c) 返回值5

     *	       @ref Int32 d    // OF_OFFSET_OF(TA,d) 返回值8
     *					  }


     *	    压缩的情况下:
     *     struct TA{
     *	       @ref Int32 a;   // OF_OFFSET_OF(TA,a) 返回值0

     *	       @ref Int8 b;    // OF_OFFSET_OF(TA,b) 返回值4

     *	       @ref Int8 c;    // OF_OFFSET_OF(TA,c) 返回值5

     *	       @ref Int32 d    // OF_OFFSET_OF(TA,d) 返回值6
     *					  }
     * @endcode
     */
#define OF_OFFSET_OF(Type, member) ((Long)&((Type*)0)->member)

#ifndef OF_CONTAINER_OF
#define OF_CONTAINER_OF(ptr, type, member)\
    (type *)( (char *)ptr - OF_OFFSET_OF(type, member));
#endif


     /** @brief 指针类型的大小

      * - 若MCU为64位,则OF_SIZEOF_PTR等于8
      * - 若MCU为32位,则OF_SIZEOF_PTR等于4
      * @{
      */
#if defined(__CC_ARM)
#if (__sizeof_ptr == 8)
#define OF_SIZEOF_PTR 8
#else
#define OF_SIZEOF_PTR 4
#endif
#else
#if (__SIZEOF_LONG__ == 8)
#define OF_SIZEOF_PTR 8
#else
#define OF_SIZEOF_PTR 4
#endif
#endif
      /** @} */
      //--------------------------------------------------------------------------------
      // 常量定义

      /// 空指针值
      /*
      #ifndef NULL
      #define NULL  ((void *)0)
      #endif
      */

      /*
      #ifndef True
      // 布尔值假
      #define False 0
      // 布尔值真
      #define True  1
      #endif
      */

#ifndef TRUE
      /// 布尔值假
#define FALSE  0
/// 布尔值真
#define TRUE   1
#endif

//--------------------------------------------------------------------------------
/**
 * @name 类型定义
 */
 /// 用于表示数据大小的类型 
 /// armcc: 32位4字节,64位8字节 gcc: 32位4字节,64位8字节
#if defined(__CC_ARM)
#if (OF_SIZEOF_PTR == 8)
    typedef unsigned long TSize;
#else
    typedef unsigned int TSize;
#endif
#else
#if (OF_SIZEOF_PTR == 8)
    typedef long unsigned int TSize;
#else
    typedef unsigned int TSize;
#endif
#endif

    /*
    #ifndef _BaseTypes_H_
    #if defined(_WIN32) || defined(_WIN64) || defined(_WINDOWS) || defined(WINCE)
        typedef unsigned __int64 UInt64;
        typedef __int64 Int64;
    #elif defined(__linux)
        typedef long long Int64;
        typedef unsigned long long UInt64;
    #else
        typedef long long Int64;
        typedef unsigned long long UInt64;
    #endif
    */

    /**
     * @name 有符号整型
     */
     /*
     typedef signed int Int32;
     typedef signed short Int16;
     typedef signed char Int8;
     typedef signed long Long;  // Leo: 2020-07-04
     */

     /**
      * @name 无符号整型
      */
      /*
      typedef unsigned int UInt32;
      typedef unsigned short UInt16;
      typedef unsigned char UInt8;

      typedef UInt64 QWord;
      typedef unsigned int DWord;
      typedef unsigned short Word;
      typedef unsigned char Byte;
      */

      /**
       * @name bool类型
       */
       //typedef unsigned char Bool; 

       /**
        * @name 时间类型
        */
        /// 用于表示时间的类型(同time_t)
    typedef long TTime;

#ifdef __cplusplus
}  // extern "C"
#endif

#endif //_OFC_TYPES_H_

/**
 * @}
 */
